1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <cstdio> #include <queue> #include <algorithm> #include <cstring> const int INF = 0x3f3f3f3f; using namespace std; int n, m, b[2][105], f[2][105], t[105]; char s[25]; int dis[(1 << 21)]; bool vis[(1 << 21)]; void Dijkstra(int S){ priority_queue <pair<int, int> > q; while (!q.empty()) q.pop(); q.push(make_pair(0, S)); memset(dis, 0x3f, sizeof dis); dis[S] = 0; while (!q.empty()){ int cur = q.top().second; q.pop(); if (vis[cur]) continue; vis[cur] = 1; for (int i = 1; i <= m; i++){ if ((cur & b[0][i]) == b[0][i] && (cur & b[1][i]) == 0){ int v = ((cur | f[0][i]) | f[1][i]) ^ f[0][i]; if (dis[v] > dis[cur] + t[i]){ dis[v] = dis[cur] + t[i]; if (!vis[v]) q.push(make_pair(-dis[v], v)); } } } } } int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++){ scanf("%d%s", t + i, s); for (int j = 0; j < n; j++) if (s[j] == '+') b[0][i] += (1 << j); else if (s[j] == '-') b[1][i] += (1 << j); scanf("%s", s); for (int j = 0; j < n; j++) if (s[j] == '-') f[0][i] += (1 << j); else if (s[j] == '+') f[1][i] += (1 << j); } Dijkstra((1 << n) - 1); if (dis[0] == INF) puts("0"); else printf("%d\n", dis[0]); return 0; }
|